package mpbe.estructura.secciones.hormigon_armado;

/*
 * Este codigo es software libre y se encuentra licenciado 
 * bajo los términos de la Licencia Pública General de GNU versión 3 
 * según se encuentra publicada por la Free Software Foundation.
 * http://www.gnu.org/licenses/gpl.html
 * 
 * Autor: Martin Pablo Bellanca <martin.bellanca@gmail.com>
 * web: http://mpbe.blogspot.com/
 */

import java.util.Iterator;
import java.util.Vector;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

import mpbe.geometria.Parametro;
import mpbe.geometria.Punto;

public class SHGrupo_de_Barras {
	public String designacion = null;
	public boolean activo;
	public Vector<Barra_Redonda> barras = null;
	
	public SHGrupo_de_Barras() {
		designacion = new String("Grupo");
		activo = true;
		barras = new Vector<Barra_Redonda>();
		//barras.add(new Barra_Redonda());
		
	}
	
	public SHGrupo_de_Barras(String designacion, boolean activo) {
		this.designacion = designacion;
		this.activo = activo;
		barras = new Vector<Barra_Redonda>();
		//barras.add(new Barra_Redonda());
	}
	
	public SHGrupo_de_Barras(String designacion, boolean activo, Vector<Barra_Redonda> barras) {
		this.designacion = designacion;
		this.activo = activo;
		this.barras = barras;
	}
	
	public void setGrupo(String designacion, boolean activo, Vector<Barra_Redonda> barras) {
		this.designacion = designacion;
		this.activo = activo;
		this.barras = barras;
	}
	public SHGrupo_de_Barras getGrupo(){
		return new SHGrupo_de_Barras(designacion, activo, barras);
	}
	public double getArea() {
		double area = 0;
		Iterator iter = barras.iterator();
		Barra_Redonda br = new Barra_Redonda();
		
		while (iter.hasNext()) {
			br = (Barra_Redonda) iter.next();
			area += br.getArea();
		}
		return area;
	}

	public double getYmin() {
		double res = 0;
		Barra_Redonda BR;
		if (barras.size()>0){
			BR = barras.get(0);
			res = BR.posY;
			for (int bb=1; bb<barras.size(); bb++){
				BR = barras.get(bb);
				if (BR.posY<res) res = BR.posY;
			}
		}
		return res;
	}
	
	public void copyInto(SHGrupo_de_Barras gb) {
		gb.designacion = designacion.toString();
		gb.activo = activo;
		Barra_Redonda bb;
		Barra_Redonda bb1;
		for (int ii=0; ii<barras.size(); ii++) {
			bb = barras.get(ii);
			bb1 = new Barra_Redonda();
			bb.copyInto(bb1);
			gb.barras.add(bb1);
		}
	}
	
	//***************************
	// Funciones de modificacion
	//***************************
	public void mod_InvetirV(){
		Barra_Redonda BR;
		for (int bb=0; bb<barras.size(); bb++){
			BR = barras.get(bb);
			BR.posY *= -1; 
		}
	}
	
	public void mover (double deltaX, double deltaY){
		Barra_Redonda BR;
		for (int bb=0; bb<barras.size(); bb++){
			BR = barras.get(bb);
			BR.posX += deltaX;
			BR.posY += deltaY;
		}
	}
	
	public void rotar(double grados){
		double rad, l;
		double delta = grados*Math.PI/180;
		Barra_Redonda BR;
		for (int bb=0; bb<barras.size(); bb++){
			BR = barras.get(bb);
			rad = Math.atan2(BR.posY,BR.posX)+ delta;
			l = Math.sqrt(BR.posX*BR.posX+BR.posY*BR.posY);
			BR.posX = Math.cos(rad)*l;
			BR.posY = Math.sin(rad)*l;
		}
	}
	
	public void ordenarBarrasD(){
		boolean repetir = true;
		int can = barras.size();
		Barra_Redonda Bii = new Barra_Redonda();
		Barra_Redonda Bm1 = new Barra_Redonda();
		Barra_Redonda Ba = new Barra_Redonda();
		
		while (repetir){
			repetir = false;
			for (int ii=1; ii<can; ii++){
				Bii = barras.get(ii);
				Bm1 = barras.get(ii-1);
				if (Bii.diametro>Bm1.diametro){
					repetir = true;
					Bii.copyInto(Ba);
					Bm1.copyInto(Bii);
					Ba.copyInto(Bm1);
				}
			}
			
			
		}
		
		
		
		
	}
	
	public void borrar(int [] barras) {
		boolean repetir = true;
		int can = barras.length;
		int Bii, Bm1;
		
		while (repetir){
			repetir = false;
			for (int ii=1; ii<can; ii++){
				Bii = barras[ii];
				Bm1 = barras[ii-1];
				if (Bii>Bm1){
					repetir = true;
					barras[ii-1]= Bii;
					barras[ii]=Bm1;
				}
			}
		}
		
		for (int ii=0; ii<can; ii++) this.barras.remove(barras[ii]);
		
		
	}
	
	//*****************************************************
	// Funciones JSON
	//*****************************************************
	public void put_JSON(JSONObject jo){
		designacion = (String) jo.get("Designacion");
		activo = (Boolean) jo.get("Activo");
		
		barras.clear();
		Barra_Redonda BR;
		JSONObject joa = new JSONObject();
		JSONArray jaBa = (JSONArray) jo.get("Barras");
		for (int ii=0; ii<jaBa.size(); ii++) {
			BR = new Barra_Redonda();
			joa = (JSONObject) jaBa.get(ii);
			BR.put_JSON(joa);
			barras.add(BR);
		}
	}
	public JSONObject get_JSONObject() {
		JSONObject jo = new JSONObject();
		
		jo.put("Designacion", designacion);
		jo.put("Activo", activo);
		
		JSONArray jaBa = new JSONArray();
		Barra_Redonda BR = new Barra_Redonda();
		for (int ii=0; ii<barras.size(); ii++) {
			BR = barras.get(ii);
			jaBa.add(BR.get_JSONObject());
		}
		jo.put("Barras", jaBa);
		
		return jo;
	}
	public String get_JSONString(int tabs) {
		String res = tabs(tabs)+"{\n";
		res += tabs(tabs+1)+"\"Activo\":"+activo+",\n";
		res += tabs(tabs+1)+"\"Designacion\":\""+designacion+"\",\n";
		
		
		res += tabs(tabs+1)+"\"Barras\":\n";
		res += tabs(tabs+1)+"[\n";
		Barra_Redonda BR = new Barra_Redonda();
		for (int ii=0; ii<barras.size(); ii++) {
			BR = barras.get(ii);
			res += BR.get_JSONString(tabs+2);
			if (ii==barras.size()-1) res += "\n"+tabs(tabs+1)+"],\n"; else res += ",\n";
		}
		
		res += tabs(tabs)+"}";
		return res;
	}
	private String tabs(int can) {
		String str = new String();
		for (int ii=0; ii<can; ii++) str += "   ";
		return str;
	}
	
}

